インフラエンジニア向け、Citrix NetScaler VPX for AWS を使ってみる
NetScalerとは、簡単にいうとロードバランサー(負荷分散装置)です。 詳細はここ参照。
- ロードバランサーを触ってみたいが、身近にVMware vSphere(ESXi)やXenServerなどのハイパーバイザーが無く、検証してみたい
- オンプレミスでロードバランサーを利用していて、クラウドでも同じものを利用したい
という方に参考になれば幸いです。
あまりお金をかけず、検証するため、以下の内容で実施しました。
- NetScalerのライセンスは、Citrixの90日間の試用版ライセンスでテストします。
- 通信試験用のEC2サーバは12ヶ月の無料枠で作成できます。
- NetScalerは有料枠のEC2サーバ上にを作成する必要があります。
ここに参考になる資料はあるのですが、複数ハマった場所がありましたので、以後試す方の参考になればと思います。 Citrix NetScaler ベストプラクティクス
また、NetScalerのライセンス選択で、サポートに差異があるため注意が必要です。 上記資料から抜粋
・従量課金方式で構築した場合 Software および EC2 利用料を AWS へお支払いいただく方式です。 簡単に 始められるメリットがありますが、国内で Citrix のサポートは受けられませんのでご注意ください。 サポートは米国 Citrix の英語によるサポートです。
・BYOL (Bring Your Own License)方式の場合 Citrix Systems 社の代理店からライセンスを購入していただき、EC2 利用料のみを AWS へお支払いいただく方式です。 Software 利用料はかかりません。また、国内で Citrix のサポートが受けられます。
*AWS Marketplaceの表示だと、Customer Licenseと推測してます。
*弊社は代理店ではありませんので、サポートできません。
では早速、構築してみたいと思います。
■検証環境ネットワークの構築
AWSのアカウントを取得し、VPC(Amazon Virtual Private Cloud)に以下の構成を作成します。
構成図
AWSのアカウントを作成。 http://aws.amazon.com/jp/register-flow/
VPCの作成には以下のこのサイトを参考にしてください。 通信検証用にサーバ2台構築し、apacheでWebサーバを構築しておきます。
ネットワークは3つ作っておきます。
■IAMでユーザ作成
NetScalerがAWS側で利用するユーザ「cns_ha」をIAMで作成します。
IAMとは
作成した後、Policyを追加します。 図の4つの項目を指定します。
■Security Groupの設定
NetScaler 管理用インターフェイスに指定するSecurity Group設定は以下の通信を許可しないと操作用GUIが表示できないため設定します。
以下の図はAWS Marketplaceに表示されている内容です。また、後で使うため、AMI-IDを確認しておきます。
■NetScaler試用版のライセンス取得
試用版ライセンスダウンロード http://www.citrix.co.jp/products/download.html
*My Citrixのアカウントも作成されるようです。
■AWS EC2 ToolのインストールとNetScalerの構築
あとでNetScalerをVPCへ構築する際に利用するため、手元のパソコンにAWS EC2 Toolのインストールを行います。 NetScalerのマニュアルの手順に含まれるため、行います。
Macを利用の方は、以下のページを参考にhomebrewをインストールしてから、EC2 Toolをインストールすると楽です。 https://dev.classmethod.jp/etc/modern-dev-environment-by-homebrew/
% brew install ec2-ami-tools ec2-api-tools
% vi .bash_profile
適時、お使いのPC環境に応じて編集してください。
# AWS Command Line Tools export AWS_ACCESS_KEY="Your AWS Access ID" export AWS_SECRET_KEY="Your AWS Secret Key" export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home/ export EC2_AMITOOL_HOME="/usr/local/Cellar/ec2-ami-tools/1.5.3/libexec" export EC2_HOME="/usr/local/Cellar/ec2-api-tools/1.7.1.0/libexec" export EC2_URL="https://ec2.ap-northeast-1.amazonaws.com" export EC2_REGION="ap-northeast-1"
次にVPC上にNetScalerを構築します。 その際に、マニュアル通りに行ってもうまく動作しない点がありました。
(1)AMIの指定がマニュアルだとIDが古いため、最新のイメージのAMIを確認する必要がありました。→「ami-19c2ba18」のところ
(2)ドキュメントが古かったせいか、m1.large指定で記載があり、最新の条件を確認する必要がありました。→「m3.large」のところ AWS Marketplaceの情報を確認しましょう。
正常に動作したコマンド
$ ec2-run-instances ami-19c2ba18 -n 1 -t m3.large -a :0:subnet-72967405:"NSIP":10.0.21.11 -a :1:subnet-07917370:"CLIENT-SIDE":10.0.0.11::::10.0.0.12, -a :2:subnet-b49173c3:"SERVER-SIDE":10.0.11.11
「-a」の後は、 :「作成する ENI番号」:「所属する Subnet(環境に合わせて変更)」:「”ニックネーム”」:「IP アドレス」:::::「サブインターフェイスのIPアドレス」で3つ作ります。
正常作成時のログ
INSTANCE <インスタンスID> ami-19c2ba18 ip-10-0-21-11.ap-northeast-1.compute.internal pending 0 m3.large 2014-08-09T03:19:19+0000 ap-northeast-1a windows monitoring-disabled 10.0.21.11 vpc-40b75e25 subnet-72967405 ebs hvm xen sg-21679944 default false NIC eni-9f2d9ce8 subnet-07917370 vpc-40b75e25 319981429384 in-use 10.0.0.11 ip-10-0-0-11.ap-northeast-1.compute.internal true NICATTACHMENT eni-attach-26b9dc21 1 attaching 2014-08-09T12:19:19+0900 true GROUP sg-21679944 default PRIVATEIPADDRESS 10.0.0.11 ip-10-0-0-11.ap-northeast-1.compute.internal PRIVATEIPADDRESS 10.0.0.12 ip-10-0-0-12.ap-northeast-1.compute.internal NIC eni-9e2d9ce9 subnet-72967405 vpc-40b75e25 319981429384 in-use 10.0.21.11 ip-10-0-21-11.ap-northeast-1.compute.internal true NICATTACHMENT eni-attach-25b9dc22 0 attaching 2014-08-09T12:19:19+0900 true GROUP sg-21679944 default PRIVATEIPADDRESS 10.0.21.11 ip-10-0-21-11.ap-northeast-1.compute.interna NIC eni-9d2d9cea subnet-b49173c3 vpc-40b75e25 319981429384 in-use 10.0.11.11 ip-10-0-11-11.ap-northeast-1.compute.internal true NICATTACHMENT eni-attach-24b9dc23 2 attaching 2014-08-09T12:19:19+0900 true GROUP sg-21679944 default PRIVATEIPADDRESS 10.0.11.11 ip-10-0-11-11.ap-northeast-1.compute.interna
■NetScalerに管理IPアドレス(NSIP)を外部からアクセスできるようにする。
作成されたインスタンスにSecurity Groupの設定し、作成したらタグをつけてわかりやすいようにしましょう。
Elastic IPを追加し、割当。Network Interfaceでタグをつけていないと、名前は表示されません。
■NetScalerにログインしてライセンス発行するためにホストIDを確認
NetScalerにsshでログインし、ライセンス用のhost IDを取得する。 初期パスワードはアプライアンス機とはことなり、AWS上のインスタンスIDとなります。
sshでログインできたら、shellモードに変更し、以下のコマンドでhost IDを確認
> shell Copyright (c) 1992-2008 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. root@ns# lmutil lmhostid -ether lmutil - Copyright (c) 1989-2007 Macrovision Europe Ltd. and/or Macrovision Corporation. All Rights Reserved. The FLEXnet host ID of this machine is "xxxxxxxxxxxx"
ライセンスを適応するため、「My Citrix」のサイトで試用版ライセンスにホストIDを関連づけし、ダウンロードしたライセンスファイルをNetScalerにアップロード
ライセンスのインストール
ここからはNetScalerの設定に入ります。ブラウザでNetScalerの管理IPへアクセスし、ライセンスを適応
文末のConfigを環境に合わせて修正した後、NetScalerへリストアすると設定する手間が省けます。
■機能選択
System > Setting
Config mode
Config basic features
■IPアドレスとインターフェイスの機能選択
System > Network > IPs > IPV4s
クライアント側(インターネット側)のインターフェイスをVirtual IP(VIP)を選択しIPアドレスを設定します。 サーバ側のインターフェイスをSubnet IP(SIP)を選択しIPアドレスを設定します。 *クライアント側を謝って、Subnet IPにして変更できなく、再度構築しなおしました。ホストIDが変更ため、ライセンス紐付けを再度やり直しました。
■Policy Base Routingを設定
デフォルトでデフォルトゲートウェイが管理用IPアドレスのルータに向いていました。 クライアント側インターフェイスから来た通信をクライアント側のルータで通信するようにするため、Policy Base Routing(PBRs)を設定します。 Macアドレス指定と、IPアドレスで指定する2種類つかえるそうですが、今回はIPアドレスで指定しました。
*Source MACは自動入力されたもので、設定しません。Next hopはAWS側のルーターのIPアドレスはx.x.x.1で指定。
■負荷分散設定
Traffic Management > Load Balancing > Servers
構築したEC2のサーバのプライベートIPアドレスを登録 通信できていればStateが緑になります。
Traffic Management > Load Balancing > Services
構築したEC2のサーバのプライベートIPアドレスとwebサーバのポート番号を登録。2週類のサービス(tcp=80と8080)を構築してみました。 通信できていればStateが緑になります。
Traffic Management > Load Balancing > Virtual Servers
クライアント側(インターネット側)のローカルIPアドレスを設定し、先ほど作成した負荷分散したいServiceを選択します。 負荷分散方式の変更などもここでおこないます。詳細はNetScalerのマニュアルを参照ください。 今回は2つ作成し、2つのアドレスでhttp公開する設定を行いました。
■最後に上記で作成したローカルアドレスとAWS Elastic IP アドレスを紐付け設定
■外部からアクセス確認
httpdをダウンさせたりして、切り替わりを確認できます。
■NetScalerのコンフィグ
#NS10.1 Build 124.1308.e # Last modified by `save config`, Sat Aug 9 16:54:41 2014 set ns config -IPAddress 10.0.21.11 -netmask 255.255.255.0 enable ns feature LB SSL enable ns mode FR L3 USNIP PMTUD set system parameter -natPcbForceFlushLimit 4294967295 set system user nsroot hogehoge -encrypted set rsskeytype -rsstype ASYMMETRIC set lacp -sysPriority 32768 -mac 06:26:e8:9a:dc:08 set interface 1/1 -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype "Xen Virtual" -ifnum 1/1 set interface 1/2 -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype "Xen Virtual" -ifnum 1/2 set interface 1/3 -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype "Xen Virtual" -ifnum 1/3 set interface LO/1 -haMonitor OFF -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype Loopback -ifnum LO/1 add ns ip6 fe80::426:e8ff:fe9a:dc08/64 -scope link-local -type NSIP -vlan 1 -vServer DISABLED -mgmtAccess ENABLED -dynamicRouting ENABLED add ns ip 10.0.11.11 255.255.255.0 -vServer DISABLED -telnet DISABLED -ftp DISABLED -gui DISABLED -snmp DISABLED -mgmtAccess ENABLED add ns ip 10.0.0.11 255.255.255.0 -type VIP -mgmtAccess ENABLED set ipsec parameter -lifetime 28800 set nd6RAvariables -vlan 1 bind nd6RAvariables -vlan 1 -ipv6Prefix :: set ipv6 -natprefix :: set snmp alarm SYNFLOOD -timeout 1 set snmp alarm HA-VERSION-MISMATCH -time 86400 -timeout 86400 set snmp alarm HA-SYNC-FAILURE -time 86400 -timeout 86400 set snmp alarm HA-NO-HEARTBEATS -time 86400 -timeout 86400 set snmp alarm HA-BAD-SECONDARY-STATE -time 86400 -timeout 86400 set snmp alarm HA-PROP-FAILURE -timeout 86400 set snmp alarm IP-CONFLICT -timeout 86400 set snmp alarm APPFW-START-URL -timeout 1 set snmp alarm APPFW-DENY-URL -timeout 1 set snmp alarm APPFW-REFERER-HEADER -timeout 1 set snmp alarm APPFW-CSRF-TAG -timeout 1 set snmp alarm APPFW-COOKIE -timeout 1 set snmp alarm APPFW-FIELD-CONSISTENCY -timeout 1 set snmp alarm APPFW-BUFFER-OVERFLOW -timeout 1 set snmp alarm APPFW-FIELD-FORMAT -timeout 1 set snmp alarm APPFW-SAFE-COMMERCE -timeout 1 set snmp alarm APPFW-SAFE-OBJECT -timeout 1 set snmp alarm APPFW-POLICY-HIT -timeout 1 set snmp alarm APPFW-VIOLATIONS-TYPE -timeout 1 set snmp alarm APPFW-XSS -timeout 1 set snmp alarm APPFW-XML-XSS -timeout 1 set snmp alarm APPFW-SQL -timeout 1 set snmp alarm APPFW-XML-SQL -timeout 1 set snmp alarm APPFW-XML-ATTACHMENT -timeout 1 set snmp alarm APPFW-XML-DOS -timeout 1 set snmp alarm APPFW-XML-VALIDATION -timeout 1 set snmp alarm APPFW-XML-WSI -timeout 1 set snmp alarm APPFW-XML-SCHEMA-COMPILE -timeout 1 set snmp alarm APPFW-XML-SOAP-FAULT -timeout 1 set snmp alarm DNSKEY-EXPIRY -timeout 1 set snmp alarm HA-LICENSE-MISMATCH -timeout 86400 set snmp alarm CLUSTER-NODE-HEALTH -time 86400 -timeout 86400 set snmp alarm CLUSTER-NODE-QUORUM -time 86400 -timeout 86400 set snmp alarm CLUSTER-VERSION-MISMATCH -time 86400 -timeout 86400 add server Web1 10.0.11.84 add server Web2 10.0.11.85 add service Web1-80 Web1 HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO add service Web2-80 Web2 HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO add service Web1-8080 Web1 HTTP 8080 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO add service Web2-8080 Web2 HTTP 8080 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO add ssl certKey ns-server-certificate -cert ns-server.cert -key ns-server.key bind cmp global ns_adv_nocmp_xml_ie -priority 8700 -gotoPriorityExpression END -type RES_DEFAULT bind cmp global ns_adv_nocmp_mozilla_47 -priority 8800 -gotoPriorityExpression END -type RES_DEFAULT bind cmp global ns_adv_cmp_mscss -priority 8900 -gotoPriorityExpression END -type RES_DEFAULT bind cmp global ns_adv_cmp_msapp -priority 9000 -gotoPriorityExpression END -type RES_DEFAULT bind cmp global ns_adv_cmp_content_type -priority 10000 -gotoPriorityExpression END -type RES_DEFAULT set lb parameter -sessionsThreshold 150000 add lb vserver Web HTTP 10.0.0.11 80 -persistenceType NONE -cltTimeout 180 add lb vserver Web2 HTTP 10.0.0.12 80 -persistenceType NONE -cltTimeout 180 set cache parameter -via "NS-CACHE-10.0: 11" set aaa parameter -maxAAAUsers 5 set ns rpcNode 10.0.21.11 -password 8a7b474124957776a0cd31b862cbe4d72b5cbd59868a136d4bdeb56cf03b28 -encrypted -srcIP * set responder param -undefAction NOOP add ca action NOOP_CA -type noop bind lb vserver Web Web1-80 bind lb vserver Web Web2-80 bind lb vserver Web2 Web1-8080 bind lb vserver Web2 Web2-8080 set ns diameter -identity netscaler.com -realm com set dns parameter -dns64Timeout 1000 add dns nsRec . a.root-servers.net -TTL 3600000 add dns nsRec . b.root-servers.net -TTL 3600000 add dns nsRec . c.root-servers.net -TTL 3600000 add dns nsRec . d.root-servers.net -TTL 3600000 add dns nsRec . e.root-servers.net -TTL 3600000 add dns nsRec . f.root-servers.net -TTL 3600000 add dns nsRec . g.root-servers.net -TTL 3600000 add dns nsRec . h.root-servers.net -TTL 3600000 add dns nsRec . i.root-servers.net -TTL 3600000 add dns nsRec . j.root-servers.net -TTL 3600000 add dns nsRec . k.root-servers.net -TTL 3600000 add dns nsRec . l.root-servers.net -TTL 3600000 add dns nsRec . m.root-servers.net -TTL 3600000 add dns addRec l.root-servers.net 199.7.83.42 -TTL 3600000 add dns addRec b.root-servers.net 192.228.79.201 -TTL 3600000 add dns addRec d.root-servers.net 199.7.91.13 -TTL 3600000 add dns addRec j.root-servers.net 192.58.128.30 -TTL 3600000 add dns addRec h.root-servers.net 128.63.2.53 -TTL 3600000 add dns addRec f.root-servers.net 192.5.5.241 -TTL 3600000 add dns addRec k.root-servers.net 193.0.14.129 -TTL 3600000 add dns addRec a.root-servers.net 198.41.0.4 -TTL 3600000 add dns addRec c.root-servers.net 192.33.4.12 -TTL 3600000 add dns addRec m.root-servers.net 202.12.27.33 -TTL 3600000 add dns addRec i.root-servers.net 192.36.148.17 -TTL 3600000 add dns addRec g.root-servers.net 192.112.36.4 -TTL 3600000 add dns addRec e.root-servers.net 192.203.230.10 -TTL 3600000 set lb monitor ldns-dns LDNS-DNS -query . -queryType Address bind service Web2-8080 -monitorName http bind service Web1-8080 -monitorName http bind service Web2-80 -monitorName http bind service Web1-80 -monitorName http add route 0.0.0.0 0.0.0.0 10.0.21.1 set ssl service nshttps-10.0.11.11-443 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set ssl service nsrpcs-10.0.11.11-3008 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set ssl service nshttps-::1l-443 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set ssl service nsrpcs-::1l-3008 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set ssl service nskrpcs-127.0.0.1-3009 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set ssl service nshttps-127.0.0.1-443 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set ssl service nsrpcs-127.0.0.1-3008 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED set vpn parameter -forceCleanup none -clientOptions all -clientConfiguration all add ns pbr ClientAccessRoute ALLOW -srcIP = 10.0.0.11-10.0.0.12 -nextHop 10.0.0.1 -priority 10 -kernelstate SFAPPLIED61 apply ns pbrs bind ssl service nshttps-10.0.11.11-443 -certkeyName ns-server-certificate bind ssl service nsrpcs-10.0.11.11-3008 -certkeyName ns-server-certificate bind ssl service nshttps-::1l-443 -certkeyName ns-server-certificate bind ssl service nsrpcs-::1l-3008 -certkeyName ns-server-certificate bind ssl service nskrpcs-127.0.0.1-3009 -certkeyName ns-server-certificate bind ssl service nshttps-127.0.0.1-443 -certkeyName ns-server-certificate bind ssl service nsrpcs-127.0.0.1-3008 -certkeyName ns-server-certificate set ns encryptionParams -method AES256 -keyValue ff0e316156e6153bd08b7ebf2da8f9bd2068a641828e615c1bcdd74dae2d560b88b3f54002de1921b927d576f12c538b58e712b8 -encrypted set inatparam -nat46v6Prefix ::/96 set ip6TunnelParam -srcIP :: set ptp -state ENABLE Done